import json
from langchain_deepseek import ChatDeepSeek
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
from pydantic import BaseModel, Field, validator
from langchain.output_parsers import PydanticOutputParser
from large_model.mode_interface.model_interface import ChatInterface
from large_model.case_template.case_template import TestCase
from utils.file_dir import get_doc_md_dir
from utils.yaml_template import case_template
from utils.yaml_utils import read_template_yaml_all, save_test_cases
import yaml
import datetime
import os
import re
from zdebug.readdock.read_md import read_and_extract_interfaces
from langchain_community.document_loaders import UnstructuredFileLoader
from langchain_core.documents import Document

# # 定义测试数据的模版
# class Product(BaseModel):
#     id: int = Field(description="产品唯一ID", example=101)
#     name: str = Field(description="产品全称，产品名称不能重复", min_length=2, max_length=50, example="智能手机")
#     price: float = Field(description="人民币价格", ge=0, example=3999.99)
#     tags: list[str] = Field(description="产品标签列表", example=["电子", "数码"])


# api_key = "sk-4ff63ec7eab54cfd9cd7c1862ddf1547"
#
# chat = ChatDeepSeek(
#     model="deepseek-chat",
#     temperature=0.7,
#     api_key=api_key
# )

# res = chat.invoke("你好")
# print(res)
# # 流式输出
# for i in chat.stream(""):
#     print(i.content, end="")

# chat = ChatInterface().qwen_model()
# chat = ChatInterface().chat_model()
#
# # 创建解析器---定义模版和输出解释器
# # parser = PydanticOutputParser(pydantic_object=Product)
# parser = PydanticOutputParser(pydantic_object=TestCase)
# # # 获取格式指令（关键！）
# # print(parser.get_format_instructions())
#
# # template = read_template_yaml_all('sessiondetail_template.yaml')
# template = read_and_extract_interfaces('D:/007/debug/apidemokeywordspyts/zdebug/readdock/optimized_interface_doc.md')

temp = """
- Role: 资深接口测试架构师与质量保障专家
- Background: 用户需要为单个接口/多个复杂接口设计高覆盖率的测试用例，要求输出严格符合JSON规范且便于自动化处理的结构化数据。
- Profile: 您是一位拥有10年接口测试经验的架构师，精通RESTful API测试方法论，擅长从接口文档中提炼关键测试场景，擅长设计边界值、异常流、性能压力等测试用例。
- Skills: 接口协议解析、测试场景建模、JSON Schema验证、断言设计、自动化测试框架集成
- Goals: 
  1. 深度解析4个接口文档，识别核心功能点和潜在风险
  2. 设计覆盖正常流、异常流、边界条件的测试用例
  3. 输出符合JSON规范的list嵌套dict结构数据
  4. 确保每个用例包含明确的断言条件和预期结果
- Constrains: 
  - 必须严格遵循JSON格式输出，禁用Markdown代码块
  - 每个接口至少生成10个测试用例
  - 必须包含正向测试、负向测试、边界测试三类场景
  - 断言条件必须与接口文档的响应规范完全对应
- Workflow:
  1. 接口分析：逐行解析接口文档，提取请求参数、响应结构、业务规则
  2. 场景设计：针对每个接口设计正常流、异常流、边界值测试场景
  3. 用例生成：将测试场景转化为结构化JSON格式，确保断言与接口规范对应
  4. 质量校验：验证JSON结构完整性，检查断言逻辑的合理性
- Initialization: 请仔细阅读接口文档{template}，确保理解每个接口的请求参数、响应结构和业务逻辑，并根据用户的要求{api_name}设计测试用例。
- OutputFormat: 纯JSON数组，不要使用Markdown代码块包裹json,每个元素格式要求为{format_instructions}接口数据格式为{parser},最终的输出格式为纯JSON格式的数组!!!
请严格遵守以下输出要求：
1. 输出必须是有效的JSON格式
2. 所有字符串必须使用双引号闭合
3. 禁止在字符串中使用未转义的控制字符
4. 不要包含任何Markdown标记, 只输出JSON格式的数组，不要其他任何内容
"""

# 定义提示词
# prompt = PromptTemplate(
#     # template="请你帮我生成三组数据，要求输出纯json格式，不要使用Markdown代码块包裹json，格式要求为{format_instructions}, 文本信息{parser}",
#     # template="你是一个经验丰富的测试专家，我需要你根据接口文档的信息{template}编写接口测试用例，"
#     #          "要求输出纯json格式，不要使用Markdown代码块包裹json，格式要求为{format_instructions}, 接口数据格式为{parser}"
#     #          "注意输出的json格式，使用列表嵌套json的形式总输出",
#     # template="你是一个经验丰富的测试专家，你需要认真的详细的读取接口文档{template}的信息， 根据用户提供的接口信息结合接口测试文档中的信息，编写详细的接口测试用例，要求如下："
#     #          "{api_name}"
#     #          "请你根据提供的接口信息，尽可能测编写接口测试用例场景"
#     #          "要求输出list嵌套json格式的数据，不要使用Markdown代码块包裹json，格式要求为{format_instructions}, 接口数据格式为{parser}"
#     #          "注意输出list嵌套json格式的数据，在设计用例时一定要注意断言和传参对应，"
#     #          "最终的输出格式一定要输出list嵌套json格式的数据",
#     template=temp,
#     # 定义输入的参数
#     input_variables=["template", "parser", "api_name"],
#     # 定义partial_variables
#     partial_variables={"format_instructions": parser.get_format_instructions()}
# )
#
# # 链式输出
# chain = prompt | chat
# result = chain.invoke({
#     "template": template,
#     "api_name": "GetShuntAndQaMode、GetSeatChannelConf、GetRobotList和GetToAgentKeywords,一共四个接口，进行接口测试用例的编写",
#     "parser": "{}，字典，不要Markdown代码块包裹JSON"
# })
#
# data_dict = json.loads(result.content)

# try:
#     data_dict = json.loads(result.content)
# except:
#     # 深度清理和预处理
#     data_dict = re.sub(
#         r'```(json)?|`|\s+$',  # 移除所有Markdown代码块标记和行尾空白
#         '',
#         result.content,
#         flags=re.DOTALL
#     )
#     fixed_data = re.sub(
#         r':\s*"([^"\\]*(?:\\.[^"\\]*)*)(?<!\\)(?!")',  # 查找未闭合字符串
#         lambda m: f': "{m.group(1)}"',  # 添加缺失的引号
#         data_dict
#     )
#     # 2. 转义未处理的特殊字符
#     fixed_data = re.sub(
#         r'\\(?![nrt"\\])',  # 查找无效转义
#         r'\\\\',  # 双倍转义
#         fixed_data
#     )
#     # 3. 处理未转义的控制字符
#     fixed_data = fixed_data.replace('\n', '\\n').replace('\t', '\\t')
#     data_dict = json.loads(fixed_data)

# test_cases = []
# for data in data_dict:
#     print(data)
#     test_cases.append(data)
#
# # 转换为YAML格式
# yaml_output = yaml.dump(test_cases, allow_unicode=True, sort_keys=False, indent=2, default_flow_style=False)
#
# # 保存到文件
# output_path = "D:/007/debug/apidemokeywordspyts/testdata/test_cases.yaml"
# with open(output_path, 'w', encoding='utf-8') as f:
#     f.write(yaml_output)
#
# print(f"成功生成 {len(test_cases)} 个测试用例")
# print(f"YAML文件已保存至: {output_path}")

from utils.data_utils import save_function_docx_content

# 1. 加载文档
# loader = UnstructuredFileLoader(get_doc_md_dir("王者aipass问答.docx"))
# documents = loader.load()
#
# # 2. 直接使用文档内容
# document_content = documents[0].page_content
# print(document_content)
#
# if document_content:
#     # 保存优化后的内容到文件
#     output_file = get_doc_md_dir("optimized_function_doc.md")
#     with open(output_file, "w", encoding="utf-8") as f:
#         f.write(document_content)
#     print(f"优化后的文档已保存到: {output_file}")
#
# else:
#     print("无法加载 Word 文件内容。")

# 读取md文件
